from typing import List, Dict, Optional, Any
from dataclasses import dataclass
from .sql_table_info import ColumnInfoSQL
from .sql_table_info import TableInfoSQL, TableInfoConfig, ColumnConfig
from datetime import datetime
from src.base.registry import bera

# 用于生成代码的字段元信息
@dataclass
class CommonColumnMetaInfo:
    # raw sql info
    sql_raw_info: ColumnInfoSQL

    config: ColumnConfig

    def __str__(self) -> str:
        # 自定义字符串表示，包含字段的主要信息
        return (
            f"CommonColumnMetaInfo: "
            f"字段名 (SQL): {self.sql_raw_info.name} | "
            f"字段类型 (SQL): {self.sql_raw_info.type} | "
            f"字段中文名: {self.config.chinese_name} | "
            f"是否显示在表格中: {'显示' if self.config.column_show else '隐藏'}"
        )

# 用于生成代码的表元信息
@dataclass
class CommonTableMetaInfo:
    sql_raw_info: TableInfoSQL  # raw sql info
    chinese_name: str    # 通用表名称，例如表显示名称
    columns: List[CommonColumnMetaInfo]  # 列信息
    current_date: str           # 当前日期，用于生成代码时的时间戳
    version: str                # 生成器版本信息
    class_name: str
    entity_name: str
    table_name: str

    def get_column_config(self, column_name: str) -> Dict[str, Any]:
        """获取字段配置"""
        if column_name not in self.columns:
            bera.logger.warning(f"警告: 在 TableInfoConfig 中未找到与字段 '{column_name}' 匹配的配置，使用默认配置.")
            return None
        return self.columns[column_name]

# 辅助函数，将 List[ColumnConfig] 转换为 Dict[str, ColumnConfig]
def list_to_dict(column_config_list: List[ColumnConfig]) -> Dict[str, ColumnConfig]:
    return {config.name: config for config in column_config_list}

def create_common_meta_info(table_info_sql: TableInfoSQL, config: TableInfoConfig) -> CommonTableMetaInfo:
    # 将 config.columns 从 List 转换为 Dict
    config_dict = list_to_dict(config.columns)

    common_columns: List[CommonColumnMetaInfo] = []

    # 遍历 SQL 表中的字段信息
    for column in table_info_sql.columns:
        # 使用字段名查找对应的 ColumnConfig
        column_name = column.name  # 假设 column 有 name 属性
        matching_config = config_dict.get(column_name)

        if matching_config:
            common_column_meta_info = CommonColumnMetaInfo(
                sql_raw_info=column,
                config=matching_config
            )
        else:
            # 使用默认配置
            default_config = ColumnConfig(
                name=column_name,
                chinese_name=f"默认_{column_name}",
            )
            common_column_meta_info = CommonColumnMetaInfo(
                sql_raw_info=column,
                config=default_config
            )
            bera.logger.warning(f"警告: 在 TableInfoConfig 中未找到与字段 '{column_name}' 匹配的配置，使用默认配置.")

        common_columns.append(common_column_meta_info)

    current_date = datetime.now().strftime("%Y-%m-%d")

    # 创建 CommonTableMetaInfo 实例
    common_table_meta_info = CommonTableMetaInfo(
        sql_raw_info=table_info_sql,           # 原始的 SQL 表信息
        chinese_name=config.chinese_name,  # 使用 TableInfoConfig 中的中文表名
        columns=common_columns,  # 列信息
        current_date=current_date,             # 生成的当前日期
        version=config.version,                # 版本信息
        class_name=config.class_name,
        table_name=config.table_name,
        entity_name=config.entity_name
    )

    return common_table_meta_info